package gphoto.vo;

import gphoto.util.GPhotoUtil;

import java.awt.Dimension;
import java.io.File;
import java.util.Calendar;
import java.util.GregorianCalendar;

import org.apache.log4j.Logger;

import util.Conversion;

public class PhotoATrierVO implements Comparable<PhotoATrierVO> {
	
	private final static Logger logger = Logger.getLogger(PhotoATrierVO.class);
	
	private File file;
	
	private Dimension dimension;
	
	private Dimension dimensionVignette;
	
	private File fileVignette;
	
	Calendar date;
	
	private long tailleEnKo;
	
	public PhotoATrierVO(File file) {
		
		this.file = file;
	}
	
	public Dimension getDimension() {
		return dimension;
	}
	
	public String getDimensionAff() {
		
		if (dimension != null) {
			return dimension.width+"x"+dimension.height;
		} else {
			return "????x????";
		}
	}

	public void setDimension(Dimension dimension) {
		this.dimension = dimension;
	}

	public File getFile() {
		return file;
	}

	public void setFile(File file) {
		this.file = file;
	}
	
	public void setPath(String path) {
		file = new File(path);
	}

	public File getFileVignette() {
		return fileVignette;
	}

	public void setFileVignette(File fileVignette) {
		this.fileVignette = fileVignette;
	}
	
	public void setPathVignette(String pathVignette) {
		fileVignette = new File(pathVignette);
	}

	/**
	 * Retourne la taille du fichier en octets
	 */
	public long getTaille() {
		return file.length();
	}
	
	/**
	 * Retourne le nom du fichier
	 */
	public String getNom() {
		return file.getName(); 
	}
	
	/**
	 * Retourne le path du fichier
	 */
	public String getPath() {
		return file.getPath(); 
	}
	
	/**
	 * Retourne le path de la vignette
	 */
	public String getPathVignette() {
		return fileVignette.getPath(); 
	}
	
	/**
	 * Initialise la date avec 3 strings.
	 */
	public void setDate(String jour, String mois, String annee, String heures, String minutes, String secondes) {
		try {
			date = new GregorianCalendar(Integer.parseInt(annee), Integer.parseInt(mois)-1, Integer.parseInt(jour), Integer.parseInt(heures), Integer.parseInt(minutes), Integer.parseInt(secondes));
			//logger.debug("Date de la photo "+file.getName()+" : "+annee+"-"+mois+"-"+jour+" "+heures+":"+minutes+":"+secondes);
		} catch(Exception e) {
			logger.error("setDate ", e);
		}
	}
	
	public Calendar getDate() {
		return date;
	}
	
	/**
	 * Retourne le jour
	 */
	public String getJourDate() {
		
		if (date != null) {
			return Conversion.getJour(date);
		} else {
			return "xx";
		}
	}
	
	/**
	 * Retourne le mois
	 */
	public String getMoisDate() {

		if (date != null) {
			return Conversion.getMois(date);
		} else {
			return "xx";
		}
	}
	
	/**
	 * Retourne l'annee
	 */
	public String getAnneeDate() {

		if (date != null) {
			return Conversion.getAnnee(date);
		} else {
			return "xxxx";
		}
	}
	
	/**
	 * Retourne l'url de la photo.
	 * e:\toto\titi.jpg --> http://localhost:8080/gPhoto/img/e/toto/titi.jpg
	 */
	public String getURL() {
		
		return GPhotoUtil.getURL(file.getPath());
	}


	/**
	 * Retourne l'url de la vignette de la photo.
	 * e:\toto\titi.jpg --> http://localhost:8080/gPhoto/img/e/toto/_v/v_titi.jpg
	 */
	public String getURLVignette() {
		
		return GPhotoUtil.getURL(fileVignette.getPath());
	}
	
	/**
	 * Comparaison par nom de fichier pour le tri
	 */
	public int compareTo(PhotoATrierVO arg0) {
		return this.getNom().compareTo(arg0.getNom());
	}
	
	/**
	 * Retourne une chaine contenant la date/heure de la prise de la photo 
	 */
	public String getDateEXIF() {
		
		if (date != null) {
			return getJourDate()+"-"+getMoisDate()+"-"+getAnneeDate();
		} else {
			return "xx-xx-xxxx";
		}
	}
	
	public boolean isPaysage() {
		
		if (dimension  == null) {
			return true;
		}
		
		if (dimension.width>dimension.height) {
			return true;
		} else {
			return false;
		}
	}
	
	public boolean isPortrait() {
		return !isPaysage();
	}

	public Dimension getDimensionVignette() {
		return dimensionVignette;
	}

	public void setDimensionVignette(Dimension dimensionVignette) {
		this.dimensionVignette = dimensionVignette;
	}
	
	public boolean isPhotoTropGrande(int tailleMax) {
		
		if (dimension.width > tailleMax || dimension.height > tailleMax) {
			return true;
		} else {
			return false;
		}
	}

	public long getTailleEnKo() {
		return tailleEnKo;
	}

	public void setTailleEnKo(long tailleEnKo) {
		this.tailleEnKo = tailleEnKo;
	}
	
	public String getTailleEnKoAff() {
		
		return Conversion.tailleOctets2String(tailleEnKo); 
	}

	public String getTailleEnKoAff(long tailleMax) {
		
		if (tailleEnKo>tailleMax) {
			return "<font color=\"red\">"+Conversion.tailleOctets2String(tailleEnKo)+"</font>";
		} else {
			return Conversion.tailleOctets2String(tailleEnKo);
		}
	}
}
